package com.ruoyi.web.common.util.format;

import org.springframework.util.ObjectUtils;

public class NumberFormatterUtil {

    public static int getBodyElementByteSize(char c) {
        // 16进制字符串转十进制，字节高5位为数据字节数
        return (Integer.parseInt(Integer.toHexString(c), 16) & 0xf8) >> 3;
    }

    public static int getBodyElementDecimalSize(char c) {
        // 16进制字符串转十进制，字节低3位为小数位数
        return Integer.parseInt(Integer.toHexString(c), 16) & 0x07;
    }

    public static String formatNumber(String number, String dataDefHex){
        Double number1 = 0d;
        if (ObjectUtils.isEmpty(number)){
            number1 = 0d;
        }else {
            number1 = Double.parseDouble(number);
        }
        int totalLength = getBodyElementByteSize((char) Integer.parseInt(dataDefHex, 16)) * 2  ;
        int decimalPlaces = getBodyElementDecimalSize((char) Integer.parseInt(dataDefHex, 16));
        return formatNumber(number1,totalLength ,decimalPlaces );
    }

    /**
     * 格式化数字为指定长度的字符串
     *
     * @param number 要格式化的数字
     * @param totalLength 总长度
     * @param decimalPlaces 小数位数（如果不需要小数，传入0）
     * @return 格式化后的字符串
     */
    public static String formatNumber(double number, int totalLength, int decimalPlaces) {
        if (decimalPlaces == 0) {
            // 无小数的情况
            String formatString = "%0" + totalLength + "d";
            return String.format(formatString, (int) number);
        } else {
            // 有小数的情况
            // 将数字乘以 10^decimalPlaces
            long scaledNumber = (long) (number * Math.pow(10, decimalPlaces));
            // 使用 %0Nd 格式化字符串，其中 N 是 totalLength
            String formatString = "%0" + totalLength + "d";
            return String.format(formatString, scaledNumber);

        }
    }

    /**
     * 解析 N(4,2) 或 N(3) 这样的字符串，提取出长度和小数位数
     *
     * @param formatString 格式字符串，例如 "N(4,2)" 或 "N(3)"
     * @return 包含长度和小数位数的数组，数组第一个元素是长度，第二个元素是小数位数
     * @throws IllegalArgumentException 如果格式字符串不符合预期
     */
    public static int[] parseNumberFormat(String formatString) {
        if (!formatString.startsWith("N(") || !formatString.endsWith(")")) {
            throw new IllegalArgumentException("格式字符串必须以 N( 开头并以 ) 结尾");
        }

        String content = formatString.substring(2, formatString.length() - 1);
        String[] parts = content.split(",");

        if (parts.length == 1) {
            // N(3) 这样的格式
            try {
                int length = Integer.parseInt(parts[0]) + 1;
                return new int[]{length, 0};
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("长度必须是整数", e);
            }
        } else if (parts.length == 2) {
            // N(4,2) 这样的格式
            try {
                int length = Integer.parseInt(parts[0]);
                int decimalPlaces = Integer.parseInt(parts[1]);
                return new int[]{length, decimalPlaces};
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("长度和小数位数必须是整数", e);
            }
        } else {
            throw new IllegalArgumentException("格式字符串格式不正确");
        }
    }

    public static void main(String[] args) {
        int i = Integer.parseInt("1a", 16);
        System.out.println(i);
//        System.out.println(formatNumber("12.00", "12")); // 输出: 1200
//        System.out.println(formatNumber(20, 4, 0));    // 输出: 0020
//        System.out.println(formatNumber(123.40, 6, 2)); // 输出: 012345
//        System.out.println(formatNumber(5, 3, 0));     // 输出: 005
//
//        // 测试解析方法
//        int[] result1 = parseNumberFormat("N(4,2)");
//        System.out.println("Length: " + result1[0] + ", Decimal Places: " + result1[1]); // 输出: Length: 4, Decimal Places: 2
//
//        int[] result2 = parseNumberFormat("N(3)");
//        System.out.println("Length: " + result2[0] + ", Decimal Places: " + result2[1]); // 输出: Length: 3, Decimal Places: 0
    }
}
